package compileMetaClass

import org.codehaus.groovy.ast.ASTNode
import org.codehaus.groovy.control.CompilePhase
import org.codehaus.groovy.control.SourceUnit
import org.codehaus.groovy.transform.ASTTransformation
import org.codehaus.groovy.transform.GroovyASTTransformation
/**
 * Groovy提供了AST变换API
 * //@GroovyASTTransformation 注解启动编译器检查AST:
 *   phase: 在哪个阶段之后介入,支持所有的阶段
 *   SEMANTIC_ANALYSIS: 语义分析之后,这之后AST才会创建出来
 */
@GroovyASTTransformation(phase = CompilePhase.SEMANTIC_ANALYSIS)
class CheckClass implements ASTTransformation{
    @Override
    void visit(ASTNode[] astNodes, SourceUnit sourceUnit) { //sourceUnit:被编译代码的引用
        sourceUnit.getAST().classes.each {classNode->
            //将源代码单元,传递到访问者中,用于自定义检测返回错误信息
            classNode.visitContents(new MyClassVisitor(sourceUnit))
        }
    }
}
